package com.AdvancedDemos.Lambda表达式与方法引用;

import java.util.ArrayList;
import java.util.function.Consumer;

public class Lambda表达式与方法引用 {
     /*
     lambda表达式作为JDK8的新特性,作用是用来简化特殊匿名内部类参数传递
     作用范围:适用于有且只有一个 "抽象方法" 的 "接口" ,即函数式接口通常含有@FunctionalInterface注解
     Java中提供了一整套function接口,都符合lambda表达式的使用条件

     使用技巧:在传递接口匿名内部类位置 alt+回车

     格式解析:
     lambda表达式是函数式编程思想
     数据输入 -> 函数(实参列表) 执行完毕获取执行结果
     ():是重写方法的形式参数列表 ()表示空参,具体变量直接写名字即可
     ->:数据传输
     函数(实参列表):接口中唯一抽象方法重写的方法体
      */

    //lambda表达式及方法引用使用技巧:
    //在传递匿名内部类位置,alt + 回车,如果
    //1.什么都没有发生,不能使用
    //2.如果只出现 replace with lambda -- 替换为lambda
    //3.如果同时出现 replace with lambda 和 replace with method reference -- 选择reference

    /**
     * Lambda表达式的省略写法
     * 1.参数类型可以省略不写
     * 2.如果只有一个参数,参数类型可以省略,同时()也可以省略
     * 3.如果Lambda表达式中的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号,此时,如果这行代码是return语句,也必须去掉return不写
     */

    /*
    方法引用是对lambda表达式的进一步优化
    Lambda:数据->功能
    方法引用:只关注功能,省去了数据,因为数据必定会传给功能
     */
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        //使用匿名内部类
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //使用Lambda表达式 简化
        list.forEach(s -> System.out.println(s));

        //有时可以使用方法引用 终极简化
        list.forEach(System.out::println);//类名::成员方法名
    }
}
